package com.imooc.distributedemo.resume.thread;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/*
ForkJoinPool使用
 */
public class FibonacciTask extends RecursiveTask<Integer> {
    private final int n;
    public FibonacciTask(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if(n<=1){
            return n;
        }else{
            // 创建两个子任务 分别计算n-1和n-2的斐波那契数列
            FibonacciTask f1 = new FibonacciTask(n-1);
            f1.fork();  //使用fork方法执行第一个

            FibonacciTask f2 = new FibonacciTask(n-2);
            f1.fork();  //使用fork方法执行第一个
            int result = f2.compute(); // 同步执行第2个子任务，并获取计算结果
            return result + f1.join(); // 使用join计算第一个子任务的结果


        }
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        FibonacciTask task = new FibonacciTask(10);
        int result = pool.invoke(task);  // 使用invoke方法执行计算任务
        pool.shutdown();
        System.out.println(result);
    }
}
